import {
    checkTokenValid,
    type CommonPageReqDTO,
    type CommonPageResDTO,
    type CommonResDTO,
    fixPageDTO
} from "@/apis/config.ts";
import request from "@/utils/request.ts";

export enum ModListOrderBy {
    SCORE_DESC, // 评分倒序
    SCORE_ASC, // 评分顺序
    USED_DESC, // 使用量倒序
    USED_ASC, // 使用量顺序
    STAR_DESC, // 星标量倒序
    STAR_ASC, // 星标量顺序
    UPDATE_DESC, // 最近更新倒序
    UPDATE_ASC, // 最近更新顺序
}

export interface ModListReqDTO {
    keyword: string // 包名、展示名模糊查询
    orderBy: ModListOrderBy
}

export interface ModListResDTO {
    modInfoId: number // 模块内部Id
    modName: string // 展示名
    modPackageName: string // 包名
    modDescription: string // 包描述
    modHomePage: string // 主页
    modTagList: string[] // 标签列表

    scoreInfo: ModMarkScoreResDTO // 打分情况
    usedInfo: ModMarkUsedResDTO // 使用情况
    starInfo: ModMarkStarResDTO // 星标状态
}

export interface ModProposalReqDTO {
    packageName: string // 包名
    modDescription: string // 包描述
    gitUrl: string // 源码地址
}

export interface ModDetailResDTO {
    baseInfo: ModListResDTO
    extraInfo: Map<string, ModExtraInfoDTO>
}

export interface ModExtraInfoDTO {
    extraInfoName: string
    extraInfoLabel: string
    extraInfoValue: string
}

export interface ModMarkUsedResDTO {
    usedAmount: number // 使用次数
    myUsed: boolean // 当前账号使用情况
}

export interface ModMarkScoreResDTO {
    scoreAvg: number // 平均分
    myScore: number // 当前账号打分情况 0则没有打分
}

export interface ModMarkStarResDTO {
    starAmount: number // 星标数
    myStar: boolean // 当前账号星标状态
}

// 包列表查询
export async function modList(data: CommonPageReqDTO<ModListReqDTO>): Promise<CommonResDTO<CommonPageResDTO<ModListResDTO>>> {
    return await request.post('/mod/list', fixPageDTO(data))
}

// 包列表查询
export async function modListWithTag(tagShortLabel: string, data: CommonPageReqDTO<ModListReqDTO>): Promise<CommonResDTO<CommonPageResDTO<ModListResDTO>>> {
    return await request.post(`/mod/list/${tagShortLabel}`, fixPageDTO(data))
}

// 包详情
export async function modDetail(packageName: string): Promise<CommonResDTO<ModDetailResDTO>> {
    return await request.post(`/mod/detail/${packageName}`)
}

// 提交包申请
// MustSignin
export async function modProposal(data: ModProposalReqDTO): Promise<CommonResDTO<number>> {
    await checkTokenValid()
    return await request.post(`/mod/proposal`, data)
}

// 标识为已使用
// MustSignin
export async function markUsed(packageName: string): Promise<CommonResDTO<ModMarkUsedResDTO>> {
    await checkTokenValid()
    return await request.post(`/mod/used/${packageName}`)
}

// 标识为未使用
// MustSignin
export async function cancelUsed(packageName: string): Promise<CommonResDTO<ModMarkUsedResDTO>> {
    await checkTokenValid()
    return await request.post(`/mod/cancelUsed/${packageName}`)
}

// 评分
// MustSignin
export async function markScore(packageName: string, score: number): Promise<CommonResDTO<ModMarkScoreResDTO>> {
    await checkTokenValid()
    return await request.post(`/mod/score/${packageName}`, undefined, {score})
}

// 取消评分
// MustSignin
export async function cancelScore(packageName: string): Promise<CommonResDTO<ModMarkScoreResDTO>> {
    await checkTokenValid()
    return await request.post(`/mod/cancelScore/${packageName}`)
}

// 星标(收藏)
// MustSignin
export async function markStar(packageName: string): Promise<CommonResDTO<ModMarkStarResDTO>> {
    await checkTokenValid()
    return await request.post(`/mod/star/${packageName}`)
}

// 取消星标(取消收藏)
// MustSignin
export async function cancelStar(packageName: string): Promise<CommonResDTO<ModMarkStarResDTO>> {
    await checkTokenValid()
    return await request.post(`/mod/cancelStar/${packageName}`)
}